#pragma once
// #define SERVER_HANDLER_DEBUG 1

#include <iostream>
#include <string>
#include <memory>
#include "Connection.hpp"
#include "Protocol.hpp"
#include "Calculator.hpp"

using namespace Calculator;

void ServerHandler(Connection* conn)
{
    if(!conn)
        return;

    std::string msg;
    std::unique_ptr<Protocol> prtc = make_unique<Protocol>();
    std::unique_ptr<Request> req = make_unique<Request>();
    bool ok;
    // 解决接收缓冲区中数据的粘包问题，以及取到完整独立的一个报文，以进行下一步操作
   
    while(prtc->Unpacking(conn->GetInBuffer(), &msg))
    {
        // 获取到独立的报文之后，开始对报文进行反序列化，得到有用的信息
        req->Deserialize(msg, &ok);
        if(!ok)
            continue;

        // 获得请求方的处理结果
        auto resp = req->Result();
        // 应答方负责将返回的结果进行序列化
        std::string content;
        resp->Serialize(&content);
        // 将序列化好的结果进行封装，并放入连接对象的发送缓冲区中
        prtc->Package(content, &content);
#ifdef SERVER_HANDLER_DEBUG
        LOG(Debug, "package: %s", CSTR(content));
#endif
        conn->PushOutBuffer(content);
    }
}